from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.

'''
支付

到相应的开放平台注册成为开发者，注册应用，按文档开发

在整个支付流程中，美多商城（我们）需要做两件事
①生成流程到支付宝的链接
②保存交易完成后，支付宝返回的交易流水号

设置公钥和私钥
美多商城一对
支付宝一对

需求：　当用户点击去支付按钮的时候，要在后端生成一个跳转链接
前端：　发送一个axios请求，携带订单id
后端：
    请求：　获取订单id
    业务逻辑：　生成支付宝链接（读取文档）
            　读取应用私钥和支付宝公钥
            　创建支付宝实例，调用支付宝的方法
            　拼接连接
    响应
    路由：　GET payment/order_id/
    步骤：　
        １．获取订单id
        ２．验证订单id　根据订单id查询订单信息
        ３．读取应用私钥和支付宝公钥
        ４．创建支付宝实例
        ５．调用支付宝的支付方法
        ６．拼接连接
        ７．返回响应
                       
'''


from django.views import View
from utils.views import LoginRequiredJSONMixin
from apps.orders.models import OrderInfo
from meiduo_mall import settings
from alipay import AliPay
from alipay.utils import AliPayConfig

class PayUrlView(LoginRequiredJSONMixin,View):

    def get(self,request,order_id):

        user = request.user

        # １．获取订单id

        # ２．验证订单id　根据订单id查询订单信息
        try:
            # 为了业务逻辑的准确性
            # 查询待支付的订单
            order = OrderInfo.objects.get(order_id=order_id,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'],
                                          user=user)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'code':400,'errmsg':'没有此订单'})

        # ３．读取应用私钥和支付宝公钥
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        # ４．创建支付宝实例
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug = settings.ALIPAY_DEBUG,  # 默认False
            verbose = False,  # 输出调试数据
            config = AliPayConfig(timeout=15)  # 可选, 请求超时时间
        )

        # ５．调用支付宝的支付方法
        # subject = u"测试订单".encode("utf8")
        # For Python 3 users, just use the default string
        subject = "美多商城测试订单"

        # Pay via Web，open this url in your browser: https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=order.total_amount,
            subject=subject,
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url="https://example.com/notify"  # this is optional
        )

        # ６．拼接连接
        pay_url = 'https://openapi.alipaydev.com/gateway.do?'+order_string

        # ７．返回响应
        return JsonResponse({'code':0,'errmsg':'ok','alipay_url':pay_url})


'''
前端：当用户支付完成后，会跳转到指定的商品页面
    　页面中的请求，查询字符串中有支付的相关信息
    　前端把这些数据提交给后端就可以了
    
后端：　
    请求：　接收数据
    业务逻辑：　查询字符串转换为字典，验证数据，
    　        验证没有问题获取支付宝交易流水号
            　改变订单状态
    响应：　
    路由：　PUT　payment/status/
    步骤：
        １．接收数据
        ２．查询字符串转换为字典，验证数据
        ３．验证没有问题获取支付宝交易流水号
        ４．改变订单状态
        ５．返回响应
    
'''



from apps.pay.models import Payment


class PaymentStatusView(View):

    def put(self,request):

        # １．接收数据
        data = request.GET

        # ２．查询字符串转换为字典，验证数据
        data = data.dict()

        # ３．验证没有问题获取支付宝交易流水号
        signature = data.pop("sign")

        # ３．读取应用私钥和支付宝公钥
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        # ４．创建支付宝实例
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG,  # 默认False
            verbose=False,  # 输出调试数据
            config=AliPayConfig(timeout=15)  # 可选, 请求超时时间
        )

        # verification
        # 校验这个重定向是否是alipay重定向过来的
        success = alipay.verify(data, signature)
        if success:
            # 读取支付宝流水号
            trade_no = data.get('trade_no')
            # 读取order_id
            order_id = data.get('out_trade_no')
            # 保存Payment模型类数据
            Payment.objects.create(
                trade_id=trade_no,
                order_id=order_id
            )

            # ４．改变订单状态
            OrderInfo.objects.filter(order_id=order_id).updata(status=OrderInfo.ORDER_STATUS_ENUM["UNSEND"])

            return JsonResponse({'code':0,'errmsg':'ok','trade_id':trade_no})

        else:
            # ５．返回响应
            return JsonResponse({'code':400,'errmsg':'请到个人中心的订单中查询订单状态'})
